package chapter8.poly_.detail;

import org.omg.PortableServer.POAPackage.ObjectAlreadyActive;

//1.向上转型
//本质：父类的引用，指向了引用的对象
//语法：父类类型  引用名 = new 子类类型();
//特点：可以调用父类中的所有成员（需要遵守访问权限）
//不能调用父类中特有成员
//最终运行效果看子类的具体实现！
public class PolyDetail {
    public static void main(String[] args) {
        Animal cat = new Cat();
        //根据子类的具体实现，如果重写了父类的方法就按照子类的方法运行。
        //运行时是根据运行类型开始查找
        cat.eat();
        cat.run();
        cat.sleep();
        //无法调用子类中的特有的成员
        //在编译阶段，能调用那些成员，是由编译类型决定的
        //cat.catchMouse();
        //所有类都是Object的子类
        Object obj = new Cat();
//向下转型（细节）
// 语法： 子类类型 引用名 = （子类类型）父类引用
// 只能强转父类的引用，不能强转父类的对象
//要求子类的引用必须只想的是当前目标类型的对象
// 可以调用子类类型中的所有的成员
        //编译类型是Cat，运行类型Cat
        Animal cat1 = new Cat();
        //向下转型,跟基本属性类型的强制类型转换有些类似（原理！！！）
        // 其实对象没有变，只不过是引用类型不同
        Cat cat2 = (Cat)cat1;
        cat2.catchMouse();
    }
}
